<!doctype html>



  


<html class="theme-next mist use-motion" lang="zh-Hans">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>



<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />












  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.1.0" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="微服务,microservice,Gitlab,配置管理,Cfg4j,Consul,Jenkins,Vault,安全,Keywhiz," />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.1.0" />






<meta name="description" content="现代系统需要访问大量的敏感信息如：数据库访问凭证，用于外部服务的API密钥，面向服务架构的通信凭据等，这使得了解谁正在访问什么敏感信息变得非常困难，并且往往是特定于某个平台。如果没有定制的解决方案，为系统添加密钥滚动切换，安全存储和详细的审计日志几乎是不可能的。">
<meta property="og:type" content="article">
<meta property="og:title" content="微服务之配置管理（3）—— Vault的Secrets管理">
<meta property="og:url" content="http://chrisrc.me/2017/02/19/configuration-management-on-dcos-vault/index.html">
<meta property="og:site_name" content="山中，山外与俯瞰">
<meta property="og:description" content="现代系统需要访问大量的敏感信息如：数据库访问凭证，用于外部服务的API密钥，面向服务架构的通信凭据等，这使得了解谁正在访问什么敏感信息变得非常困难，并且往往是特定于某个平台。如果没有定制的解决方案，为系统添加密钥滚动切换，安全存储和详细的审计日志几乎是不可能的。">
<meta property="og:image" content="http://chrisrc.me/images/vault-arch-overview.png">
<meta property="og:image" content="http://chrisrc.me/images/vault-master-keys-shares-arch.png">
<meta property="og:updated_time" content="2017-02-19T08:15:11.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="微服务之配置管理（3）—— Vault的Secrets管理">
<meta name="twitter:description" content="现代系统需要访问大量的敏感信息如：数据库访问凭证，用于外部服务的API密钥，面向服务架构的通信凭据等，这使得了解谁正在访问什么敏感信息变得非常困难，并且往往是特定于某个平台。如果没有定制的解决方案，为系统添加密钥滚动切换，安全存储和详细的审计日志几乎是不可能的。">
<meta name="twitter:image" content="http://chrisrc.me/images/vault-arch-overview.png">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Mist',
    sidebar: {"position":"left","display":"post"},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://chrisrc.me/2017/02/19/configuration-management-on-dcos-vault/"/>





  <title> 微服务之配置管理（3）—— Vault的Secrets管理 | 山中，山外与俯瞰 </title>
</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  










  
  
    
  

  <div class="container one-collumn sidebar-position-left page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-meta ">
  

  <div class="custom-logo-site-title">
    <a href="/"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">山中，山外与俯瞰</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle">一次永不停止的探索之旅</p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-dcos">
          <a href="/dcos" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-book"></i> <br />
            
            DC/OS
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      

      
        <li class="menu-item menu-item-search">
          
            <a href="javascript:;" class="st-search-show-outputs">
          
            
              <i class="menu-item-icon fa fa-search fa-fw"></i> <br />
            
            搜索
          </a>
        </li>
      
    </ul>
  

  
    <div class="site-search">
      
  <form class="site-search-form">
  <input type="text" id="st-search-input" class="st-search-input st-default-search-input" />
</form>

<script type="text/javascript">
  (function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){
    (w[n].q=w[n].q||[]).push(arguments);};s=d.createElement(t);
    e=d.getElementsByTagName(t)[0];s.async=1;s.src=u;e.parentNode.insertBefore(s,e);
  })(window,document,'script','//s.swiftypecdn.com/install/v2/st.js','_st');

  _st('install', 'R9GcmhBwxpsAGLNCsquZ','2.0.0');
</script>



    </div>
  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
  <link itemprop="mainEntityOfPage" href="http://chrisrc.me/2017/02/19/configuration-management-on-dcos-vault/">

  <span style="display:none" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <meta itemprop="name" content="chrisrc">
    <meta itemprop="description" content="">
    <meta itemprop="image" content="/images/avatar.gif">
  </span>

  <span style="display:none" itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
    <meta itemprop="name" content="山中，山外与俯瞰">
    <span style="display:none" itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
      <img style="display:none;" itemprop="url image" alt="山中，山外与俯瞰" src="">
    </span>
  </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                微服务之配置管理（3）—— Vault的Secrets管理
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2017-02-19T18:28:18+08:00">
                2017-02-19
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/微服务/" itemprop="url" rel="index">
                    <span itemprop="name">微服务</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <a href="/2017/02/19/configuration-management-on-dcos-vault/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2017/02/19/configuration-management-on-dcos-vault/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          

          
          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        <p>现代系统需要访问大量的敏感信息如：数据库访问凭证，用于外部服务的API密钥，面向服务架构的通信凭据等，这使得了解谁正在访问什么敏感信息变得非常困难，并且往往是特定于某个平台。如果没有定制的解决方案，为系统添加密钥滚动切换，安全存储和详细的审计日志几乎是不可能的。</p>
<a id="more"></a>
<h3 id="Vault"><a href="#Vault" class="headerlink" title="Vault"></a>Vault</h3><p>HashiCorp的<a href="https://www.vaultproject.io" target="_blank" rel="external">Vault</a>是一个安全访问Secrets的工具。Secrets是需要严格控制访问权限的任何内容，例如API密钥，密码，证书等。Vault为任何secret提供统一的接口，同时提供严格的访问控制并记录详细的审计日志。</p>
<p>其主要特性包括：</p>
<ul>
<li>安全的Secrets存储</li>
</ul>
<p>任意键/值Secrets可以存储在Vault中。Vault在将这些Secrets写入永久存储器之前对其加密，因此访问原始存储器无法直接访问您的敏感信息。Vault可以将加密数据写入磁盘，<a href="https://www.consul.io/" target="_blank" rel="external">Consul</a>等等。</p>
<ul>
<li>动态的Secrets</li>
</ul>
<p>Vault可以为某些系统（如AWS或SQL数据库）动态生成访问凭据。例如，当应用程序需要访问MySQL数据库时，它会向Vault询问凭据，Vault将根据需要生成具有有效权限的MySQL数据库访问密钥对。创建这些动态访问凭据之后，Vault还会在租期结束后自动撤销这些凭据。</p>
<ul>
<li>数据加密</li>
</ul>
<p>Vault可以加密和解密数据而不存储。这允许安全团队定义加密参数，开发人员负责将加密的数据存储在诸如SQL数据库中而不必设计自己的加密方法。</p>
<ul>
<li>租赁和续约（Leasing and Renewal）</li>
</ul>
<p>Vault中的所有Secrets都具有与其关联的租约。在租赁结束时，Vault会自动撤销该Secret。客户可以通过内置的更新API更新租约。</p>
<ul>
<li>撤销（Revocation）</li>
</ul>
<p>Vault内置支持Secrets的撤销。Vault不仅可以撤销单个secret，而且可以撤销Secrets树，例如由特定用户读取的所有Secrets或特定类型的所有Secrets。撤销功能可以协助Secrets的滚动切换以及在入侵的情况下锁定系统。</p>
<h4 id="Vault架构"><a href="#Vault架构" class="headerlink" title="Vault架构"></a>Vault架构</h4><p><img src="/images/vault-arch-overview.png" alt=""></p>
<p>在详解上述架构之前，先来看一下Vault架构所涉及的几个概念：</p>
<ul>
<li>存储后端（Storage Backend）</li>
</ul>
<p>存储后端负责加密数据的持久存储。Vault不信任存储后端，并且仅期望其提供持久性存储功能。在启动Vault服务器时需要配置存储后端。</p>
<ul>
<li>屏障（Barrier）</li>
</ul>
<p>屏障如同银行保险库的外层防护钢壳和围绕穹顶的混凝土。在Vault和存储后端之间流动的所有数据都通过屏障。该屏障确保仅输出加密数据，并且该数据在进入时被验证和解密。任何内部数据可以访问之前，障碍必须“开封”。</p>
<ul>
<li>Secret后端（Secret Backend）</li>
</ul>
<p>Secret后端负责管理Secrets。简单的Secret后端像“<code>generic</code>”后端在查询时简单地返回相同的secret。某些后端支持使用策略在每次查询时动态生成secret。这允许使用唯一的secret，可以让Vault进行细粒度的撤销和策略更新。例如，一个MySQL后端可以配置一个“web”策略。当读取“web”密码时，将生成一个新的MySQL用户/密码对，其仅具有Web服务器的有限权限集。</p>
<ul>
<li>审计后端（Audit Backend）</li>
</ul>
<p>审计后端负责管理审计日志。来自Vault的每个请求和来自Vault的响应都将通过配置的审核后端。这提供了一种将Vault与不同类型的多个审核日志记录目标集成的简单方法。</p>
<ul>
<li>凭据后端（Credential Backend）</li>
</ul>
<p>凭据后端用于验证连接到Vault的用户或应用程序。一旦验证，后端返回应用的适用策略列表。Vault接受经过身份验证的用户，并返回可用于将来请求的客户端令牌。例如，用户密码后端使用用户名和密码来认证用户。</p>
<ul>
<li>客户端令牌（Client Token）</li>
</ul>
<p>客户端令牌在概念上类似于网站上的会话cookie。用户验证后，Vault会返回一个用于将来请求的客户端令牌。Vault使用令牌验证客户端的身份并强制实施适用的ACL策略。此令牌通过HTTP头传递。</p>
<ul>
<li>Secret</li>
</ul>
<p>Secret是Vault返回的包含机密或加密信息的任何内容。不是由Vault返回的所有内容都是Secret，例如系统配置，状态信息或后端策略不被视为Secrets。Secret总是有相关的租约，这意味着客户端不能假设Secret可以无限期地使用。Vault将在租赁结束时撤销Secret，并且维护人员可以在租赁结束之前进行干预以撤销Secret。</p>
<ul>
<li>服务器（Server）</li>
</ul>
<p>Vault依赖于作为服务器运行的长时间运行的实例。 Vault服务器提供了一个API，客户端与之交互并管理所有后端之间的交互，ACL实施和Secret租用撤销。采用基于服务器的架构可以客户端与安全密钥及策略分离，实现集中式审计日志记录并简化操作员的管理。</p>
<p>再看上述Vault架构图，从图中可以看出组件被屏障Barrier清晰的隔离为内外两部分。只有存储后端和HTTP API位于外部，其他组件都位于屏障内部。存储后端是不可信的，被Vault用来存储加密后的数据。</p>
<p>Vault启动时处于<strong>密封（“sealed”）</strong>状态，在可以与其交互之前，Vault必须切换到<strong>启封（“unsealed”）</strong>状态。状态切换需要提供启封钥匙。Vault初始化时会生成一把加密密钥来保护所有的数据，这个加密密钥受<strong>主钥匙</strong>（master key）保护。默认情况下，Vault使用<a href="https://en.wikipedia.org/wiki/Shamir&#39;s_Secret_Sharing" target="_blank" rel="external">Shamir的密钥共享算法</a>将主钥匙拆分为5份，必须提供5个密钥中任意3个来重建主钥匙。</p>
<p><img src="/images/vault-master-keys-shares-arch.png" alt=""></p>
<p>主钥匙拆分的数量及用来重建主钥匙的最低份数都可以设置，也可以禁用Shamir的密钥共享算法，这时需要使用主钥匙直接启封Vault。一旦Vault检索到加密密钥，它就能够解密存储后端中的数据，并进入启封状态。取消密封后，Vault会加载所有配置的审计，凭据和Secrets后端。</p>
<p>当客户端首次连接到Vault时，需要进行身份验证。 Vault提供可配置的凭据后端（Credential Backend），为客户端提供灵活的身份验证机制，如操作人员可使用用户名/密码，GitHub验证，而应用可以使用公私钥或Token令牌验证。一个验证请求从Vault内核进入凭据后端，由其校验合法性并返回一个关联的策略列表。</p>
<p>策略只是一个命名的ACL规则，例如，“<code>root</code>”策略是一个内置策略，具有所有资源的访问权限。可以创建任意数量的命名策略来细粒度的控制访问路径。Vault以白名单模式运作，除非透过策略明确授予存取权限，否则不允许执行操作。由于用户可能具有多个关联的策略，因此如果任何一个策略允许，则允许操作。策略由内部策略存储库存储和管理，此内部存储通过系统后端操作，系统后端始终挂载在<code>sys/</code>下。</p>
<p>校验过程中，凭据后端通过提供的策略进行验证，如果验证通过会生成一个新的客户端令牌保存到令牌存储，并返回给客户端供后续请求使用。如果凭据后端的配置为客户端令牌设定了租约，则该客户端令牌必须周期性的生成以避免变得无效。</p>
<p>校验通过后，所有的请求必须提供令牌，通过令牌可以校验客户端是否得到授权并加载相关的策略，加载的策略用于校验用户特定操作是否得到授权。操作请求随后路由到Secrets后端，由其根据自身类型进行相应的处理。如果Secrets后端返回了一个secret，Vault内核会将其注册到过期管理服务并为其附加一个租用ID。客户端可以使用这个租用ID来撤销或重新生成其secret，如果客户端允许租约自动过期，则由过期管理服务负责secret的到期撤销。</p>
<p>Vault内核负责记录请求和响应并发送给审计总线，再由其存储到审计后端。在请求处理流程之外，Vault内核负责某些后台操作，如关键的租约管理可以撤销客户端令牌和自动撤销Secrets。此外，Vault通过使用回滚管理器使用预写写日志（write ahead logging）来处理某些部分故障情况的恢复。</p>
<h4 id="Secret-Backends"><a href="#Secret-Backends" class="headerlink" title="Secret Backends"></a>Secret Backends</h4><ul>
<li>AWS</li>
<li>Cassandra</li>
<li>Consul</li>
<li>Cubbyhole</li>
<li>Generic</li>
<li>MongoDB</li>
<li>MSSQL</li>
<li>MySQL</li>
<li>PKI (Certificates)</li>
<li>PostgreSQL</li>
<li>RabbitMQ</li>
<li>SSH</li>
<li>Transit</li>
<li>Custom</li>
</ul>
<h4 id="Auth-Backends"><a href="#Auth-Backends" class="headerlink" title="Auth Backends"></a>Auth Backends</h4><ul>
<li>App ID</li>
<li>AppRole</li>
<li>AWS EC2</li>
<li>GitHub</li>
<li>LDAP</li>
<li>MFA</li>
<li>Okta</li>
<li>RADIUS</li>
<li>TLS Certificates</li>
<li>Tokens</li>
<li>Username &amp; Password</li>
</ul>
<h4 id="Audit-Backends"><a href="#Audit-Backends" class="headerlink" title="Audit Backends"></a>Audit Backends</h4><ul>
<li>File</li>
<li>Syslog</li>
<li>Socket</li>
</ul>
<h3 id="Keywhiz"><a href="#Keywhiz" class="headerlink" title="Keywhiz"></a>Keywhiz</h3><p><a href="https://github.com/square/keywhiz" target="_blank" rel="external">Keywhiz</a>是Square开发的用于管理和分发秘密的系统。它可以很好地适应面向服务的体系结构（SOA）。</p>
<p>关于Keywhiz与Vault的对比可以参考：<a href="https://www.vaultproject.io/intro/vs/keywhiz.html" target="_blank" rel="external">Vault vs. Keywhiz</a>。</p>
<h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul>
<li><p>关于微服务框架相关实践及与DC/OS的整合请参考:<a href="http://chrisrc.me/dcos">《DC/OS修炼之路》</a>。</p>
</li>
<li><p><a href="http://code.flickr.net/2016/03/24/configuration-management-for-distributed-systems-using-github-and-cfg4j/" target="_blank" rel="external">http://code.flickr.net/2016/03/24/configuration-management-for-distributed-systems-using-github-and-cfg4j/</a></p>
</li>
</ul>

      
    </div>

    <div>
      
        

      
    </div>

    <div>
      
        

      
    </div>


    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/微服务/" rel="tag"># 微服务</a>
          
            <a href="/tags/microservice/" rel="tag"># microservice</a>
          
            <a href="/tags/Gitlab/" rel="tag"># Gitlab</a>
          
            <a href="/tags/配置管理/" rel="tag"># 配置管理</a>
          
            <a href="/tags/Cfg4j/" rel="tag"># Cfg4j</a>
          
            <a href="/tags/Consul/" rel="tag"># Consul</a>
          
            <a href="/tags/Jenkins/" rel="tag"># Jenkins</a>
          
            <a href="/tags/Vault/" rel="tag"># Vault</a>
          
            <a href="/tags/安全/" rel="tag"># 安全</a>
          
            <a href="/tags/Keywhiz/" rel="tag"># Keywhiz</a>
          
        </div>
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2017/02/18/configuration-management-on-dcos-cfg4j/" rel="next" title="微服务之配置管理（2）—— Cfg4j">
                <i class="fa fa-chevron-left"></i> 微服务之配置管理（2）—— Cfg4j
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2017/04/13/cloud-ai-thinking/" rel="prev" title="弹性智能自适应生态体系">
                弹性智能自适应生态体系 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </article>



    <div class="post-spread">
      
        <div class="ds-share flat" data-thread-key="2017/02/19/configuration-management-on-dcos-vault/"
     data-title="微服务之配置管理（3）—— Vault的Secrets管理"
     data-content=""
     data-url="http://chrisrc.me/2017/02/19/configuration-management-on-dcos-vault/">
  <div class="ds-share-inline">
    <ul  class="ds-share-icons-16">

      <li data-toggle="ds-share-icons-more"><a class="ds-more" href="javascript:void(0);">分享到：</a></li>
      <li><a class="ds-weibo" href="javascript:void(0);" data-service="weibo">微博</a></li>
      <li><a class="ds-qzone" href="javascript:void(0);" data-service="qzone">QQ空间</a></li>
      <li><a class="ds-qqt" href="javascript:void(0);" data-service="qqt">腾讯微博</a></li>
      <li><a class="ds-wechat" href="javascript:void(0);" data-service="wechat">微信</a></li>

    </ul>
    <div class="ds-share-icons-more">
    </div>
  </div>
</div>
      
    </div>
  </div>


          </div>
          


          
  <div class="comments" id="comments">
    
      <div class="ds-thread" data-thread-key="2017/02/19/configuration-management-on-dcos-vault/"
           data-title="微服务之配置管理（3）—— Vault的Secrets管理" data-url="http://chrisrc.me/2017/02/19/configuration-management-on-dcos-vault/">
      </div>
    
  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/images/avatar.gif"
               alt="chrisrc" />
          <p class="site-author-name" itemprop="name">chrisrc</p>
          <p class="site-description motion-element" itemprop="description"></p>
        </div>
        <nav class="site-state motion-element">
          <div class="site-state-item site-state-posts">
            <a href="/archives">
              <span class="site-state-item-count">69</span>
              <span class="site-state-item-name">日志</span>
            </a>
          </div>

          
            <div class="site-state-item site-state-categories">
              <a href="/categories">
                <span class="site-state-item-count">21</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            <div class="site-state-item site-state-tags">
              <a href="/tags">
                <span class="site-state-item-count">162</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
            
              <span class="links-of-author-item">
                <a href="https://github.com/christtrc" target="_blank" title="GitHub">
                  
                    <i class="fa fa-fw fa-github"></i>
                  
                  GitHub
                </a>
              </span>
            
              <span class="links-of-author-item">
                <a href="https://twitter.com/chrisrc" target="_blank" title="Twitter">
                  
                    <i class="fa fa-fw fa-twitter"></i>
                  
                  Twitter
                </a>
              </span>
            
          
        </div>

        
        
          <div class="cc-license motion-element" itemprop="license">
            <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" class="cc-opacity" target="_blank">
              <img src="/images/cc-by-nc-sa.svg" alt="Creative Commons" />
            </a>
          </div>
        

        
        

        


      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-3"><a class="nav-link" href="#Vault"><span class="nav-number">1.</span> <span class="nav-text">Vault</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#Vault架构"><span class="nav-number">1.1.</span> <span class="nav-text">Vault架构</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Secret-Backends"><span class="nav-number">1.2.</span> <span class="nav-text">Secret Backends</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Auth-Backends"><span class="nav-number">1.3.</span> <span class="nav-text">Auth Backends</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Audit-Backends"><span class="nav-number">1.4.</span> <span class="nav-text">Audit Backends</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Keywhiz"><span class="nav-number">2.</span> <span class="nav-text">Keywhiz</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#参考"><span class="nav-number">3.</span> <span class="nav-text">参考</span></a></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy;  2015 - 
  <span itemprop="copyrightYear">2017</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">
     
      <a href="mailto:chrisrc@qq.com">chrisrc</a> 
    
  </span>
  <span class="author"> &nbsp; QQ: 58122705 </span>
</div>


<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Mist
  </a>
</div>


        

        
      </div>
    </footer>

    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
    </div>
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  



  
  <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.0"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.0"></script>



  
  

  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.0"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.0"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.0"></script>



  

  
    
  

  <script type="text/javascript">
    var duoshuoQuery = {short_name:"chrisrc"};
    (function() {
      var ds = document.createElement('script');
      ds.type = 'text/javascript';ds.async = true;
      ds.id = 'duoshuo-script';
      ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
      ds.charset = 'UTF-8';
      (document.getElementsByTagName('head')[0]
      || document.getElementsByTagName('body')[0]).appendChild(ds);
    })();
  </script>

  
    
    
    <script src="/lib/ua-parser-js/dist/ua-parser.min.js?v=0.7.9"></script>
    <script src="/js/src/hook-duoshuo.js"></script>
  








  
  

  

  

  
<script>
(function(){
    var bp = document.createElement('script');
    var curProtocol = window.location.protocol.split(':')[0];
    if (curProtocol === 'https') {
        bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';        
    }
    else {
        bp.src = 'http://push.zhanzhang.baidu.com/push.js';
    }
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(bp, s);
})();
</script>


  
<script>
(function(){
   var src = (document.location.protocol == "http:") ? "http://js.passport.qihucdn.com/11.0.1.js?ed903ab05fbc5fa64d95e4bfbf3d3a04":"https://jspassport.ssl.qhimg.com/11.0.1.js?ed903ab05fbc5fa64d95e4bfbf3d3a04";
   document.write('<script src="' + src + '" id="sozz"><\/script>');
})();
</script>

  


</body>
</html>
